home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9303 / VIVID.CD < prev    next >
Text File  |  1995-04-15  |  32KB  |  743 lines

  1.           
  2.           @VKövessük a sugarakat!@N
  3.           
  4.           @VVivid@N
  5.           
  6.           A  PC-sek  körében  kevésbé  elterjedt,  viszont  az  Amigák
  7.           világában  igen  felkapott  a ray-tracing. Ennek talán az az
  8.           oka,  hogy PC-n csak kevés és viszonylag lassú (legalábbis a
  9.           PC-sek  felfogásához  képest lassú) ray-tracing program van.
  10.           Az egyik legjobb ezek közül a Vivid programcsomag.
  11.           
  12.           
  13.           A  ray-tracinget (sugárkövetés) a hetvenes években dolgozták
  14.           ki.  Akkoriban  a  gépek még nem támogatták a képek grafikus
  15.           megjelenítését.  A  nyolcvanas  évek  közepén  a ray-tracing
  16.           több  hullámban,  az  olcsó  és  jó  grafikus  képességekkel
  17.           rendelkezô   számítógépek  megjelenésével  egyre  kedveltebb
  18.           lett.   Talán   ezért   is   van,   hogy   ha   elhangzik  a
  19.           ""ray-tracing"  szó,  mindenki  rögtön  egy  Amigára gondol.
  20.           Lehet,  hogy  igaza  van,  de  a  PC-k  gyors  fejlôdésükkel
  21.           betörtek  a  grafikai  piacra  is.  Ma egy átlagos Super VGA
  22.           kártya  általában  többet  nyújt, mint egy szokványos Amiga,
  23.           és  az  esetek  többségében  már egy nagyteljesítményû PC is
  24.           hozzáférhetô  a  szükséges számolások elvégzéséhez. Ilyenkor
  25.           már csak a megfelelô program hiányzik.
  26.           
  27.           Én  három  (PC-s)  ray-tracert  ismerek  közelebbrôl:  a DBW
  28.           Rendert,  a  QRT-t  és  a  Vividet.  A  DBW Render általában
  29.           nehézkesen   használható,   mivel   egy  igen  barátságtalan
  30.           leírónyelven  keresztül programozható (egy betû és utána egy
  31.           halom   szám),  ráadásul  a  generált  képet  alaphelyzetben
  32.           (különbözô  saját konverterek nélkül) csak rossz hatásfokkal
  33.           lehet  valamilyen  megnézhetô formára hozni. A program Amiga
  34.           emulátor  alá  lett  beültetve, és ez ront a teljesítményén.
  35.           A  QRT-nél  szintén  a  kép  megnézésével volt gondunk. PC-s
  36.           változata  ugyanis  csak 64 színt kezel a leírás szerint, és
  37.           a  kijövô  formátumot  ugyancsak  nehézkes  hasznosítani  --
  38.           hiszen  pontosan  ugyanaz  a  formátuma, mint a DBW Renderé.
  39.           Elônye   a  szabadon  definiálható  alakzatokban  rejlik.  A
  40.           Vivid  talán  nem  tud  annyit, mint társai, de kényelmes és
  41.           könnyen  használható  -- illetve a hiányosságait (nem voltak
  42.           szabadon    definiálható   formák)   egy   saját   készítésû
  43.           objektumeditorral    (alakzatszerkesztôvel)    könnyen    ki
  44.           lehetett küszöbölni.
  45.           
  46.           Ha  végigolvastuk a program dokumentációját, fogalmat kapunk
  47.           leírónyelve   --   amely   leginkább   a  C-re  hasonlít  --
  48.           képességeirôl,   és   már   azonnal,  a  leírásba  alig-alig
  49.           belepillantva   szép   képeket   hozhatunk   össze.   A  kép
  50.           elkészítésének  menete  lehetôség  szerint  az egyszerûbbtôl
  51.           haladjon   a   fokozatosan   bonyolultabbig.  Tehát  ne  egy
  52.           papíron   teljesen  kidolgozott  beállítást  vigyünk  be  --
  53.           hacsak  nem  vagyunk  nagyon  gyakorlottak  --, mert könnyen
  54.           csalódások érhetnek.
  55.           
  56.           Talán  lássunk  egy  rövid példát egy egyszerû, de látványos
  57.           rajz  elkészítésének  menetére!  Az elkészítendô rajz legyen
  58.           mondjuk  egy  sakktábla  figurákkal  (teljes forrásszövege a
  59.           65.   oldalon   olvasható).   Ha   még   nem   foglalkoztunk
  60.           ray-tracerrel,  akkor az egyik példafile fejlécét vegyük elô
  61.           --  bár elsô látásra kicsit bonyolult, de a késôbbiekben ezt
  62.           is  ismertetjük.  Ebben  a  fejlécben  történik  a környezet
  63.           paramétereinek   beállítása.  Itt  olyan  dolgokat  adhatunk
  64.           meg,  hogy  mekkora  legyen  a  kép felbontása, mi legyen az
  65.           alapvetô  normálvektor,  alkalmazzon-e  antialiasinget (ez a
  66.           sugarak    széttartásából    származó   felbontási   hibákat
  67.           küszöböli   ki),   milyen   legyen   a   háttér   színe,   a
  68.           háttérvilágítás  színe.  A  kamera paramétereit is itt adjuk
  69.           meg,  tehát  a  kamera  pozícióját  és  azt, hogy merre néz.
  70.           Megadhatjuk  a  kamera  fókuszpontját és lencseátmérôjét is,
  71.           de  ha  ezt  elhagyjuk, a program egy fizikailag a képet nem
  72.           módosító  lencsével  számol  --  tehát  a  kép minden pontja
  73.           egyformán  éles  lesz.  Megadhatunk még ködösítést, amivel a
  74.           távolság   érzetét   lehet   jobban   alátámasztani  és  egy
  75.           véletlenítést,  ami  a képpontokat ""borzolja össze" ezáltal
  76.           valósabbá   teszi   azokat   a  képeket,  amelyek  bonyolult
  77.           textúrákat   tartalmaznak.   Ezek  a  beállítások  a  @Kstudio@N
  78.           @K=|@N [forrássor után következnek.
  79.           
  80.           Ezek   után  helyezzünk  el  egy  alaplapot  --  hacsak  nem
  81.           akarjuk,  hogy  a  semmiben  lógjanak a tárgyaink, bár az is
  82.           érdekes  látvány.  Érdemes  az  alaplapot körnek választani,
  83.           mert   azt   gyorsabban   számolja  ki  a  Vivid,  mint  egy
  84.           négyszöget.  Helyezzük  el  a  fô  tárgyat.  Ez  általában a
  85.           legnagyobb  illetve  a  kép  jellegét  legjobban meghatározó
  86.           tárgy,  ezúttal  a  sakktábla.  Számoltassuk  ki  a  géppel,
  87.           mondjuk  40x40-es  méretben,  és nézzük meg, hogy körülbelül
  88.           jó-e.     Használjunk     nulla     átmérôjû     objektívet,
  89.           fókusztávolság  nélkül, mert ez hozzávetôleg megtízszerezi a
  90.           sebességet.
  91.           
  92.           A  sakktábla  tehát egy öt téglalapból álló test (a hatodik,
  93.           az  alapja  úgysem  látszik, tehát érdemes elhagyni -- ilyen
  94.           apró  trükkökkel  sok  számítási  idôt  takaríthatunk  meg),
  95.           márványos  színezetû.  A  készülô  sakktábla  tetejét (tehát
  96.           nem  egy  síkban  a  fedôlappal, mert akkor csak a fedôlapot
  97.           számolja   ki   a   program,   hanem   elhanyagolhatóan  kis
  98.           magasságban  lebegve  a fedôlap fölött) egy újabb négyzetlap
  99.           foglal  helyet,  amit  ""kockás"  festékkel festünk be, hogy
  100.           hasonlítson egy valódi sakktáblára.
  101.           
  102.           A  különbözô  textúrákat  (a  testek felületmintáit) könnyen
  103.           meg  lehet  érteni  a forráslistából, tehát rájuk nem térünk
  104.           ki  részletesebben.  Illetve  egy  dolgot mégis megemlítünk,
  105.           ugyanis   elkövettünk  egy  turpisságot.  A  valódi  márvány
  106.           fekete-zöld-fehér      színét     jobban     megközelítendô,
  107.           beállítottunk  egy zöld színû lámpát, ami a ""márványunkból"
  108.           egyes  helyeken  zöldes  árnyalatokat  csal  ki, míg a többi
  109.           testnél  a  fehér  fény  visszaverôdése  lesz a meghatározó.
  110.           Erre  azért  volt  szükség, hogy ne kelljen egy többszörösen
  111.           egymásba ágyazódó felületstruktúrát létrehozni.
  112.           
  113.           Ha  az  eddigi  eredmény  nagyjából  jó,  akkor  egy nagyobb
  114.           felbontásban  végezzük  el  a finombeállításokat (1. kép) --
  115.           ezúttal  például  azt, hogy a tábla erezete megfelel-e. Ezek
  116.           után  néhány  fontosabb tárgyat helyezzünk el, és nézzük meg
  117.           az   eredményt   kis   felbontásban.   Következô   lépésként
  118.           helyezzük  el  a  bábukat,  most  még csak egy-egy hengerrel
  119.           érdemes  helyettesíteni  ôket  (hiszen  egyelôre  csak  arra
  120.           vagyunk kíváncsiak, hogy mi hol lesz a késôbbiekben).
  121.           
  122.           Miután  a  bábuk elfoglalták a helyüket, egyenként helyezzük
  123.           ki  ôket  egy külön file-ba. Ezt minden összetettebb testnél
  124.           érdemes  elvégezni,  hiszen  így csak a tárgyat számoltatjuk
  125.           ki  a  géppel  (a  környezetét  meg  nem), amikor módosítunk
  126.           rajta.  Ha  a  tárgyak  már az elképzeléseinknek megfelelôen
  127.           néznek   ki,   akkor   helyezzük   ôket   vissza  (2.  kép).
  128.           Fokozatosan  bôvítgessünk  különbözô  tárgyakkal, hogy a kép
  129.           ""hitelesebb"  legyen.  Rakjunk fel például egy sakkórát (3.
  130.           kép).  Majd  rakjunk  fel  néhány  leütött bábut is, a tábla
  131.           mellé  (4. kép). Ezek után különbözô apró részletekkel lehet
  132.           gazdagítani   a   képet,  például  filctalpakat  helyezni  a
  133.           sakkbábuk  aljára,  ellenôrizni  az óra mutatójának árnyékát
  134.           -- ha ezeket eddig még nem tettük volna meg.
  135.           
  136.           Vigyázzunk  arra,  hogy  ne  bonyolítsuk  túl  a képet, mert
  137.           elveszti  a  hatását, az ""igazi" képeket úgysem fogjuk soha
  138.           utolérni.  Ezért  nincs fent példánkon sem mind a harminckét
  139.           bábu.  S  ugyanezért  ne törekedjünk túlzottan a realitásra,
  140.           inkább  a  látványosság  legyen  a fontos. Persze a realitás
  141.           elhanyagolásával   is   csínján   kell   bánni.  Nem  szabad
  142.           elôfordulnia,  hogy  egy  képen  ég  egy  lámpa, és az izzón
  143.           megcsillan  a  fény,  az  alja pedig szürke árnyékos. Csalni
  144.           leginkább  a  színekkel és az arányokkal lehet. Mint fentebb
  145.           a  márványnál,  vagy  ha  egy  test  egyik  oldala  nem elég
  146.           árnyékos,  nem homogén színûre, hanem oldalanként sötétebbre
  147.           állítjuk  be,  vagy  ha  egy tárgy perspektívája rossz, de a
  148.           teljes  képé  jó, akkor a tárgy távolabbi méreteit egy picit
  149.           változtassuk meg.
  150.           
  151.           És  végezetül egy jótanács: ha a Vivid fordító ""MATH error"
  152.           felkiáltással  áll  le,  akkor: 1. Nézzük meg az ""at" egyik
  153.           értékét   a   @Kstudio@N   résznél,   növeljük   meg  például  a
  154.           @KZ@N-t   egy   elhanyagolhatóan   kicsi  számmal  (valamiért  a
  155.           program   vektorkezelése  nem  tökéletes).  2.  Nézzük  meg,
  156.           nincs-e  olyan  testünk,  amelynek  gyakorlatilag  csak  két
  157.           oldala  van,  tehát  például  egy  olyan  négyzet,  amelynek
  158.           két-két koordinátapárja megegyezik.
  159.           
  160.           Sajnos  a  számolások még az igazán gyors PC-ken is lassúak.
  161.           Egyrészt  rengeteget kell számolni -- koprocesszor nélkül ne
  162.           is   indítsuk   el  --,  másrészt  a  ray-tracing  programok
  163.           általában  Amigáról  lettek  átírva.  Ebbôl  következôen nem
  164.           használják  ki  teljesen  a gép lehetôségeit (nem mindegyik,
  165.           például   a  QRT  és  a  Vivid  már  PC-n  íródott).  Nagyot
  166.           gyorsíthatna  a  programok  futásán  az is, ha a programozók
  167.           nem  a  könnyû  javíthatóságot és áttekinthetôséget tartanák
  168.           szem   elôtt   (ami   általában   nagyon  helyes),  hanem  a
  169.           sebességet,  tehát  például  a viszonylag lassú lebegôpontos
  170.           mûveleteket   trükkösen   átírnák  egész  számokkal  végzett
  171.           mûveletekre.    A    munka    sebességének   érzékeltetésére
  172.           közzétesszük   a   mi  idôméréseink  eredményeit.  Az  egyik
  173.           oszlop  egy 50 MHz-es Netrend 486DX-n, a másik egy 66 MHZ-es
  174.           Makro  486DX2-n  készült  (e  gépek teljesítményérôl szintén
  175.           ebben  a  számban olvashatnak). A táblázat adataiból könnyen
  176.           levonható  a  következtetés, hogy a mérettel közel egyenesen
  177.           arányos  a  számolás  idôigénye.  Egy  nagy képet még ezek a
  178.           gépek  is  több  napig  számolnak.  A  nyitóképet például --
  179.           amely 4096x2732 pont felbontású -- több mint négy nap
  180.           alatt számolta ki az egyik gép.
  181.           
  182.           A  Vivid  kettes  verzióját  csak lapzártakor kaptuk kézhez,
  183.           így   a  cikken  már  jelentôsen  nem  tudtunk  változtatni,
  184.           fentiekben  az  1.0 verziót mutattuk be. Az új verzióban sok
  185.           apró  hibát  kijavítottak,  s kiküszöbölték a két legégetôbb
  186.           problémát:   az   objektumkiemelést  és  a  memóriakezelést.
  187.           Most  már  bármennyi  objektumot tudunk kezelni, ha van elég
  188.           memóriánk,  a  régi  verzióban  a határ úgy 2000 darab körül
  189.           volt.  Növelték  a  felhasználható fényforrások számát, azok
  190.           számára,  akik  türelmesen  ki  tudják várni az alkalmazásuk
  191.           által megnövekedett számolási idôt.
  192.           
  193.           Ugyancsak    hasznos    újítás,    hogy    több   gépen   is
  194.           számoltathatjuk  ugyanazt  a képet, megadva a kezdôsort és a
  195.           végsort,   majd  a  kész  képcsíkokat  összemásolhatjuk  egy
  196.           képpé.    Helyet    kapott   egy   vázlatfunkció   is,   ami
  197.           meggyorsítja  a ""fejlesztést", hiszen így már nincs szükség
  198.           az  egyes  elemek  külön  file-okba való kipakolgatására. Az
  199.           új  verzió  támogatja az alapvetô matematikai mûveleteket --
  200.           például  összeadás,  szorzás,  szögfüggvények  --  számokra,
  201.           vektorokra   és   színekre   nézve.  Támogatja  a  különbözô
  202.           globális   transzformációkat  és  a  bonyolultabb  alakzatok
  203.           létrehozását a különbözô metszési lehetôségekkel.
  204.           
  205.           Ezek  persze  csak  a  legfontosabb  és elsôre is szembetûnô
  206.           újítások,  amelyeket  a dokumentáció elolvasása után tudtunk
  207.           meg.   Külön   kiemeljük,  hogy  a  szerzô  a  dokumentációt
  208.           jelentôsen   bôvítette   és  javította,  a  tôle  megszokott
  209.           humoros  hangnem  továbbra sem maradt el. Akinek van egy kis
  210.           ideje,  annak  már  csak  ezért is érdemes végigböngésznie a
  211.           leírást.  Sok  olyan  apró  dolog van, amit most nem tudtunk
  212.           megemlíteni.   Reméljük,  hogy  ezek  bemutatására  is  sort
  213.           tudunk   keríteni,   s  ezért  sem  vállalkoztunk  a  termék
  214.           elkapkodott  leírására.  Elöljáróban  csak  annyit: a leírás
  215.           húsz  bekezdése  taglalja  az  újításokat.  Ezeket  mind meg
  216.           kellene  vizsgálni  a gyakorlatban is, de ez sok idôbe kerül
  217.           (egy ray-tracernél különösen).
  218.           
  219.           Jó  hír  azok számára, akik szeretnék felvenni a kapcsolatot
  220.           a    program   szerzôjével,   Stephen   B.   Coy-jal,   hogy
  221.           folyamatosan  megszerezhessék  a  legújabb  kiegészítôket: a
  222.           dokumentációban  megtalálhatók  azon  BBS-ek  címei,  ahol a
  223.           szerzô   legtöbbször   fordul  meg.  Természetesen  él  régi
  224.           e-mail  címe  is,  és ""emailetileg" ez a leggyorsabb útja a
  225.           kapcsolatfelvételnek,  de  sajnos  ez Magyarországon még nem
  226.           egy kiforrott dolog.
  227.           
  228.           Sajnos  a  PC-s  ray-tracing áttörése ""ma" még nem várható,
  229.           csak  ha  már  mindenkinek egy 486-os agyú ""vadállat" lapul
  230.           az  asztalán,  esetleg  egy Pentium alapú gép. Addig mit sem
  231.           ér   a   Vivid   szerzôjének   jóindulata,  aki  sörware-nek
  232.           nyilvánította  a  programját  (azaz,  ha  tetszik, igyál egy
  233.           sört   az  egészségére,  ha  pénzt  nem  küldesz).  Ajánlott
  234.           regisztrációs  díjnak  30 dollárt ír, a 386-osokra fordított
  235.           változatért  50  dollárt  kér.  Ezért  a Zortech és az Intel
  236.           DOS-extenderével  lefordított  programot  (mind a kettôt, és
  237.           ízlés szerint választhatunk) kapjuk.
  238.           
  239.           @KLencsés Gábor@N
  240.           
  241.           
  242.           
  243.           <1 - box> @VA Vivid leírónyelve@N
  244.           
  245.           @KMegjegyzés:@N
  246.           
  247.           // Egy soros megjegyés
  248.           /* Megjegyzés */
  249.           
  250.           @KParaméterezés:@N
  251.           
  252.           A  paramétereket  több módon is megadhatjuk (például 0.5, .5
  253.           stb.)  Az  @Kx@N  paraméter  a  szélesség,  az  @Ky@N  a  mélység, a
  254.           @Kz@N a magasság értékét adja meg.
  255.           
  256.           @KUtasítások:@N
  257.           
  258.            studio = [Alapbeállítások
  259.            from = x y z; Honnan nézzük a teret
  260.            at = x y z; Hova nézünk
  261.            up = x y z; A vízszintes sík normálvektora
  262.            (""felfelé" mutató vektor)
  263.            angle = ang; Látószög
  264.            resolution = i j; Felbontás
  265.            aspect = asp; A torzítás mértéke (x/y)
  266.            ambient = acolor; Az árnyék színe
  267.            background = bcolor; A háttér színe
  268.            haze = density; Köd sûrûsége
  269.            antialias = mode; Az antialiasing módja
  270.            threshold = dist; Az antialiasing finomsága (ha van)
  271.            jitter; Véletlen fénytörések bekapcsolása
  272.            aperture = size; Lencseméret
  273.            focal_length = dist; Fókusztávolság
  274.            no_shadows; Årnyékok kikapcsolása
  275.            depth = max_depth; A fénytörések mélysége
  276.            
  277.           
  278.            sphere = [Gömb
  279.            center = x y z; Középpont
  280.            radius = r; Åtmérô
  281.            (radius2 = r2; Második átmérô (véletlenül választ
  282.            a két átmérô között))
  283.            @N
  284.           
  285.            ring = [Korong
  286.            center = x y z; Középpont
  287.            radius = r; Åtmérô
  288.            (normal = xn yn zn; Normálvektor)
  289.            (radius2 = 2; Belsô átmérô)
  290.            
  291.           
  292.            polygon = [Sokszög
  293.            points = n; Pontjai
  294.            vertex = x y z; A pontok koordinátái
  295.            (. További pontok)
  296.            @N
  297.           
  298.            patch = [Háromszög
  299.            vertex = x1 y1 z1; Pont1
  300.            normal1 = xn1 yn1 zn1; Normálvektor1
  301.            vertex = x2 y2 z2; Pont2
  302.            normal2 = xn2 yn2 zn2; Normálvektor2
  303.            vertex = x3 y3 z3; Pont3
  304.            normal3 = xn3 yn3 zn3; Normálvektor3
  305.            
  306.           
  307.           
  308.           
  309.           <2 - táblázat> @VIdômérések@N
  310.           
  311.            486DX/50 486DX2/66
  312.           
  313.           kép méret perc:mp perc:mp
  314.           
  315.           BALL 1024x 768 99:34 --
  316.           
  317.           PBCHESS 40x 40 0:25 0:19
  318.           
  319.           PBCHESS 100x 100 2:00 1:33
  320.           
  321.           PBCHESS 400x 400 21:21 16:28
  322.           
  323.           PBCHESS 1024x 768 92:34 71:25
  324.           
  325.           PBCHESS 2048x2048 246:00 --
  326.           
  327.           VIVID3 1024x 768 565:49 --
  328.           
  329.           A  BALL  és a VIVID3 a Vividhez adott demófile-ok, a PBCHESS
  330.           a   cikkben   szereplô   sakktábla  egy  korai  állapota.  A
  331.           PBCHESS-t  --  40x40-es  felbontást kérve -- lefuttattuk egy
  332.           33   MHz-es,  koprocesszor  nélküli  386-os  gépen,  mintegy
  333.           háromnegyed óra alatt készült el.
  334.           
  335.           
  336.           
  337.            @V15 - lista@N
  338.           
  339.           // sakktábla
  340.           studio = 
  341.            [from = 20 20 15;
  342.            at = 0 0 0.1;
  343.            up = 0 0 1;
  344.            angle = 30;
  345.            res = 2048 1366;
  346.            antialias = adaptive;
  347.            threshold = 8;
  348.            aspect = 1.488;
  349.            background = black;
  350.            ambient = gray;
  351.           @N
  352.           
  353.           // fények
  354.           light = 
  355.            [center = 10 10 10;
  356.            falloff = 0;
  357.            color = white;
  358.            type = point;
  359.           
  360.           light = 
  361.            [center = 12 12 12;
  362.            falloff = 0;
  363.            color = green;
  364.            type = point;
  365.           @N
  366.           
  367.           // Asztallap
  368.           // faminta
  369.           surface = 
  370.            [texture = 
  371.            [noise = 
  372.            [scale = 1.1 .9 1;
  373.            amp = .2;
  374.            terms = 3;
  375.            
  376.            pattern = spherical;
  377.            scale = 0 1 1;
  378.            offset = 0 0 1;
  379.            blend = .4;
  380.            radius = .15;
  381.            radius = .05;
  382.            surf = [diff = .45 .25 .20; @N // light rings
  383.            surf = [diff = .20 .05 .03; // dark rings
  384.            @N
  385.           
  386.           ring = 
  387.            [center = 0 0 -.5;
  388.            normal = 0 0 1;
  389.            radius = 20;
  390.           @N
  391.           
  392.           // sakk-kockák
  393.           surface = 
  394.            [texture = 
  395.            [pattern = checker;
  396.            scale = 1 1 0;
  397.            surface = [diff = white; 
  398.            surface = 
  399.            [diff = black;
  400.            spec = 0.7 0.7 0.7;
  401.            shine = 100;
  402.            @N
  403.            
  404.           @N
  405.           polygon = [points = 4;
  406.            vertex = 4 4 0.3;
  407.            vertex = 4 -4 0.3;
  408.            vertex = -4 -4 0.3;
  409.            vertex = -4 4 0.3;
  410.           
  411.           
  412.           // táblaanyag
  413.           surface = 
  414.            [texture = 
  415.            [blend = 0.5;
  416.            pattern = checker;
  417.            noise = 
  418.            [amp = 3;
  419.            terms = 2;
  420.            @N
  421.            scale = 1 1 1;
  422.            surface = [diff = gray; 
  423.            surface = 
  424.            [diff = black;
  425.            shine = 20;
  426.            @N
  427.            
  428.           @N
  429.           
  430.           // surface = [diff = black; spec = 0.5 0.5 0.5; 
  431.           
  432.           polygon = [points = 4;
  433.            vertex = -5 -5 0;
  434.            vertex = -5 5 0;
  435.            vertex = -5 5 0.2999;
  436.            vertex = -5 -5 0.2999;
  437.           @N
  438.           polygon = [points = 4;
  439.            vertex = 5 -5 0;
  440.            vertex = 5 5 0;
  441.            vertex = 5 5 0.2999;
  442.            vertex = 5 -5 0.2999;
  443.           
  444.           polygon = [points = 4;
  445.            vertex = -5 -5 0;
  446.            vertex = -5 -5 0.2999;
  447.            vertex = 5 -5 0.2999;
  448.            vertex = 5 -5 0;
  449.           @N
  450.           polygon = [points = 4;
  451.            vertex = -5 5 0;
  452.            vertex = -5 5 0.2999;
  453.            vertex = 5 5 0.2999;
  454.            vertex = 5 5 0;
  455.           
  456.           polygon = [points = 4;
  457.            vertex = -5 -5 0;
  458.            vertex = -5 5 0;
  459.            vertex = 5 5 0;
  460.            vertex = 5 -5 0;
  461.           @N
  462.           polygon = [points = 4;
  463.            vertex = -5 -5 0.2999;
  464.            vertex = -5 5 0.2999;
  465.            vertex = 5 5 0.2999;
  466.            vertex = 5 -5 0.2999;
  467.           
  468.           
  469.           // bábuk
  470.           
  471.           surface = [diff = blue; shine = 1000; @N
  472.           
  473.           // gyalogok
  474.           cone = [apex_radius = 0.15; apex = 1.5 -1.5 1.31;
  475.            base_radius = 0.3; base = 1.5 -1.5 0.31;
  476.           sphere = [radius = 0.3; center = 1.5 -1.5 1.59; @N
  477.           cone = [apex_radius = 0.15; apex = 6 -2 1.01;
  478.            base_radius = 0.3; base = 6 -2 0.01;
  479.           sphere = [radius = 0.3; center = 6 -2 1.29; @N
  480.           cone = [apex_radius = 0.15; apex = 6 -3 1.01;
  481.            base_radius = 0.3; base = 6 -3 0.01;
  482.           sphere = [radius = 0.3; center = 6 -3 1.29; @N
  483.           cone = [apex_radius = 0.15; apex = 6.5 -1 0.15;
  484.            base_radius = 0.3; base = 5.5 -1 0.15; 
  485.           sphere = [radius = 0.3; center = 6.3 -1 0.15; @N
  486.           
  487.           // bástya
  488.           cone = [apex_radius = 0.18; apex = -3.5 -2.5 1.31;
  489.            base_radius = 0.3; base = -3.5 -2.5 0.41; 
  490.           cone = [apex_radius = 0.28; apex = -3.5 -2.5 1.31;
  491.            base_radius = 0.28; base = -3.5 -2.5 1.71; @N
  492.           cone = [apex_radius = 0.3; apex = -3.5 -2.5 0.31;
  493.            base_radius = 0.3; base = -3.5 -2.5 0.41; 
  494.           
  495.           // király
  496.           cone = [apex_radius = 0.18; apex = -1.5 -2.5 1.61;
  497.            base_radius = 0.3; base = -1.5 -2.5 0.31; @N
  498.           ring = [center = -1.5 -2.5 1.52;
  499.            radius = 0.3;
  500.            normal = 0 0 1; 
  501.           sphere = [radius = 0.29; center = -1.5 -2.5 1.81; @N
  502.           sphere = [radius = 0.15; center = -1.5 -2.5 2.1; 
  503.           cone = [apex_radius = 0.3; apex = -1.5 -2.5 0.31;
  504.            base_radius = 0.3; base = -1.5 -2.5 0.41; @N
  505.           
  506.           // huszár
  507.           cone = [apex_radius = 0.16; apex = 6 -4 1.01;
  508.            base_radius = 0.3; base = 6 -4 0.01; 
  509.           polygon = [points = 4;
  510.            vertex = 6.3 -4.15 1.31;
  511.            vertex = 6.3 -3.85 1.31;
  512.            vertex = 6.3 -3.85 0.91;
  513.            vertex = 6.3 -4.15 0.91;
  514.           @N
  515.           polygon = [points = 4;
  516.            vertex = 5.7 -4.2 1.51;
  517.            vertex = 5.7 -3.8 1.51;
  518.            vertex = 5.7 -3.8 1.01;
  519.            vertex = 5.7 -4.2 1.01;
  520.           
  521.           polygon = [points = 4;
  522.            vertex = 6.3 -4.15 1.21;
  523.            vertex = 6.3 -4.15 0.91;
  524.            vertex = 5.7 -4.2 1.01;
  525.            vertex = 5.7 -4.2 1.51;
  526.           @N
  527.           polygon = [points = 4;
  528.            vertex = 6.3 -3.85 1.21;
  529.            vertex = 6.3 -3.85 0.91;
  530.            vertex = 5.7 -3.8 1.01;
  531.            vertex = 5.7 -3.8 1.51;
  532.           
  533.           polygon = [points = 4;
  534.            vertex = 6.3 -4.15 1.21;
  535.            vertex = 6.3 -3.85 1.21;
  536.            vertex = 5.7 -3.8 1.51;
  537.            vertex = 5.7 -4.2 1.51;
  538.           @N
  539.           polygon = [points = 4;
  540.            vertex = 6.3 -4.15 0.91;
  541.            vertex = 6.3 -3.85 0.91;
  542.            vertex = 5.7 -3.8 1.01;
  543.            vertex = 5.7 -4.2 1.01;
  544.           
  545.           surface = [diff = red; shine = 1000; @N
  546.           
  547.           // gyalog
  548.           cone = [apex_radius = 0.15; apex = -2.5 1.5 1.31;
  549.            base_radius = 0.3; base = -2.5 1.5 0.31;
  550.           sphere = [radius = 0.3; center = -2.5 1.5 1.59; @N
  551.           cone = [apex_radius = 0.15; apex = -6 3 1.01;
  552.            base_radius = 0.3; base = -6 3 0.01;
  553.           sphere = [radius = 0.3; center = -6 3 1.29; @N
  554.           
  555.           // bástya
  556.           cone = [apex_radius = 0.18; apex = -6 2 1.01;
  557.            base_radius = 0.3; base = -6 2 0.01; 
  558.           cone = [apex_radius = 0.28; apex = -6 2 1.01;
  559.            base_radius = 0.28; base = -6 2 1.41; @N
  560.           cone = [apex_radius = 0.3; apex = -6 2 0.01;
  561.            base_radius = 0.3; base = -6 2 0.11; 
  562.           
  563.           // huszár
  564.           cone = [apex_radius = 0.16; apex = 1.5 1.5 1.31;
  565.            base_radius = 0.3; base = 1.5 1.5 0.31; @N
  566.           polygon = [points = 4;
  567.            vertex = 1.8 1.35 1.61;
  568.            vertex = 1.8 1.65 1.61;
  569.            vertex = 1.8 1.65 1.21;
  570.            vertex = 1.8 1.35 1.21;
  571.           
  572.           polygon = [points = 4;
  573.            vertex = 1.2 1.3 1.81;
  574.            vertex = 1.2 1.7 1.81;
  575.            vertex = 1.2 1.7 1.31;
  576.            vertex = 1.2 1.3 1.31;
  577.           @N
  578.           polygon = [points = 4;
  579.            vertex = 1.8 1.35 1.51;
  580.            vertex = 1.8 1.35 1.21;
  581.            vertex = 1.2 1.3 1.31;
  582.            vertex = 1.2 1.3 1.81;
  583.           
  584.           polygon = [points = 4;
  585.            vertex = 1.8 1.65 1.51;
  586.            vertex = 1.8 1.65 1.21;
  587.            vertex = 1.2 1.7 1.31;
  588.            vertex = 1.2 1.7 1.81;
  589.           @N
  590.           polygon = [points = 4;
  591.            vertex = 1.8 1.35 1.51;
  592.            vertex = 1.8 1.65 1.51;
  593.            vertex = 1.2 1.7 1.81;
  594.            vertex = 1.2 1.3 1.81;
  595.           
  596.           polygon = [points = 4;
  597.            vertex = 1.8 1.35 1.21;
  598.            vertex = 1.8 1.65 1.21;
  599.            vertex = 1.2 1.7 1.31;
  600.            vertex = 1.2 1.3 1.31;
  601.           @N
  602.           cone = [apex_radius = 0.16; apex = -6 4 1.01;
  603.            base_radius = 0.3; base = -6 4 0.01; 
  604.           polygon = [points = 4;
  605.            vertex = -5.7 3.85 1.31;
  606.            vertex = -5.7 4.15 1.31;
  607.            vertex = -5.7 4.15 0.91;
  608.            vertex = -5.7 3.85 0.91;
  609.           @N
  610.           polygon = [points = 4;
  611.            vertex = -6.3 3.8 1.51;
  612.            vertex = -6.3 4.2 1.51;
  613.            vertex = -6.3 4.2 1.01;
  614.            vertex = -6.3 3.8 1.01;
  615.           
  616.           polygon = [points = 4;
  617.            vertex = -5.7 3.85 1.21;
  618.            vertex = -5.7 3.85 0.91;
  619.            vertex = -6.3 3.8 1.01;
  620.            vertex = -6.3 3.8 1.51;
  621.           @N
  622.           polygon = [points = 4;
  623.            vertex = -5.7 4.15 1.21;
  624.            vertex = -5.7 4.15 0.91;
  625.            vertex = -6.3 4.2 1.01;
  626.            vertex = -6.3 4.2 1.51;
  627.           
  628.           polygon = [points = 4;
  629.            vertex = -5.7 3.85 1.21;
  630.            vertex = -5.7 4.15 1.21;
  631.            vertex = -6.3 4.2 1.51;
  632.            vertex = -6.3 3.8 1.51;
  633.           @N
  634.           polygon = [points = 4;
  635.            vertex = -5.7 3.85 0.91;
  636.            vertex = -5.7 4.15 0.91;
  637.            vertex = -6.3 4.2 1.01;
  638.            vertex = -6.3 3.8 1.01;
  639.           
  640.           
  641.           // király
  642.           cone = [apex_radius = 0.18; apex = 3.5 -1.5 1.61;
  643.            base_radius = 0.3; base = 3.5 -1.5 0.31; @N
  644.           ring = [center = 3.5 -1.5 1.52;
  645.            radius = 0.3;
  646.            normal = 0 0 1; 
  647.           sphere = [radius = 0.29; center = 3.5 -1.5 1.81; @N
  648.           sphere = [radius = 0.15; center = 3.5 -1.5 2.1; 
  649.           cone = [apex_radius = 0.3; apex = 3.5 -1.5 0.31;
  650.            base_radius = 0.3; base = 3.5 -1.5 0.41; @N
  651.           
  652.           // talpak
  653.           surface = [diff = green; 
  654.           cone = [apex_radius = 0.3; apex = 1.5 -1.5 0.3;
  655.            base_radius = 0.3; base = 1.5 -1.5 0.31; @N
  656.           cone = [apex_radius = 0.3; apex = -3.5 -2.5 0.3;
  657.            base_radius = 0.3; base = -3.5 -2.5 0.31; 
  658.           cone = [apex_radius = 0.3; apex = -1.5 -2.5 0.3;
  659.            base_radius = 0.3; base = -1.5 -2.5 0.31; @N
  660.           cone = [apex_radius = 0.3; apex = -2.5 1.5 0.3;
  661.            base_radius = 0.3; base = -2.5 1.5 0.31;
  662.           cone = [apex_radius = 0.3; apex = 1.5 1.5 0.3;
  663.            base_radius = 0.3; base = 1.5 1.5 0.31; @N
  664.           cone = [apex_radius = 0.3; apex = 3.5 -1.5 0.3;
  665.            base_radius = 0.3; base = 3.5 -1.5 0.31; 
  666.           cone = [apex_radius = 0.3; apex = 6 -2 0.3;
  667.            base_radius = 0.3; base = 6 -2 0.31; @N
  668.           cone = [apex_radius = 0.3; apex = 6 -3 0.3;
  669.            base_radius = 0.3; base = 6 -3 0.31; 
  670.           cone = [apex_radius = 0.3; apex = 6 -4 0.3;
  671.            base_radius = 0.3; base = 6 -4 0.31; @N
  672.           cone = [apex_radius = 0.3; apex = -6 2 0.3;
  673.            base_radius = 0.3; base = -6 2 0.31; 
  674.           cone = [apex_radius = 0.3; apex = -6 3 0.3;
  675.            base_radius = 0.3; base = -6 3 0.31; @N
  676.           cone = [apex_radius = 0.3; apex = -6 4 0.3;
  677.            base_radius = 0.3; base = -6 4 0.31; 
  678.           cone = [apex_radius = 0.3; apex = 5.5 -1 0.15;
  679.            base_radius = 0.3; base = 5.49 -1 0.15; @N
  680.           
  681.           // óra
  682.           surface = [diff = white; 
  683.           polygon = [points = 4;
  684.            vertex = -3 -6 0;
  685.            vertex = -3 -8 0;
  686.            vertex = -3 -8 3;
  687.            vertex = -3 -6 3;
  688.           @N
  689.           polygon = [points = 4;
  690.            vertex = 3 -6 0;
  691.            vertex = 3 -8 0;
  692.            vertex = 3 -8 3;
  693.            vertex = 3 -6 3;
  694.           
  695.           polygon = [points = 4;
  696.            vertex = -3 -6 0;
  697.            vertex = -3 -6 3;
  698.            vertex = 3 -6 3;
  699.            vertex = 3 -6 0;
  700.           @N
  701.           polygon = [points = 4;
  702.            vertex = -3 -8 0;
  703.            vertex = -3 -8 3;
  704.            vertex = 3 -8 3;
  705.            vertex = 3 -8 0;
  706.           
  707.           polygon = [points = 4;
  708.            vertex = -3 -6 0;
  709.            vertex = -3 -8 0;
  710.            vertex = 3 -8 0;
  711.            vertex = 3 -6 0;
  712.           @N
  713.           surface = [diff = 0.95 0.95 0.95; 
  714.           polygon = [points = 4;
  715.            vertex = -3 -6 3;
  716.            vertex = -3 -8 3;
  717.            vertex = 3 -8 3;
  718.            vertex = 3 -6 3;
  719.           @N
  720.           surface = [diff = gray; 
  721.           ring = [center = -1.5 -5.99 1.5;
  722.            radius = 1.3;
  723.            normal = 0 1 0; @N
  724.           ring = [center = 1.5 -5.99 1.5;
  725.            radius = 1.3;
  726.            normal = 0 1 0; 
  727.           surface = [diff = blue; @N
  728.           cone = [apex_radius = 0.04; apex = -1.5 -5.83 1.5;
  729.            base_radius = 0.04; base = -1.5 -5.83 2.78; 
  730.           cone = [apex_radius = 0.9; apex = -1.5 -7 3.3;
  731.            base_radius = 0.9; base = -1.5 -7 3; @N
  732.           ring = [center = -1.5 -7 3.3;
  733.            radius = 0.9;
  734.            normal = 0 0 1; 
  735.           surface = [diff = red; @N
  736.           cone = [apex_radius = 0.04; apex = 1.5 -5.83 1.5;
  737.            base_radius = 0.04; base = 1.5 -5.83 2.78; 
  738.           cone = [apex_radius = 0.9; apex = 1.5 -7 3;
  739.            base_radius = 0.9; base = 1.5 -7 3.3; @N
  740.           ring = [center = 1.5 -7 3.3;
  741.            radius = 0.9;
  742.            normal = 0 0 1; 
  743.